package com.ren.service;

import com.ren.constants.AppConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;

public class ScheduleManage {
    private static final Logger logger = LoggerFactory.getLogger(ScheduleManage.class);

    // 文件映射
    private Map<String, String> fileMap;
    private Path dataDir;

    public ScheduleManage() {
        // 初始化 dataDir 为当前工作目录下的 data 文件夹
        dataDir = Path.of("data");
        // 若目录不存在则创建
        try {
            Files.createDirectories(dataDir);
        } catch (IOException e) {
            logger.error("无法创建数据目录: {}", dataDir.toAbsolutePath(), e);
        }

        initializeFileMap();
        logger.info("ScheduleManage 初始化完成");
    }

    private void initializeFileMap() {
        fileMap = new HashMap<>();
        fileMap.put(AppConstants.CATEGORY_IMPORTANT_URGENT, "important_urgent.json");
        fileMap.put(AppConstants.CATEGORY_IMPORTANT_NOT_URGENT, "important_not_urgent.json");
        fileMap.put(AppConstants.CATEGORY_NOT_IMPORTANT_URGENT, "not_important_urgent.json");
        fileMap.put(AppConstants.CATEGORY_NOT_IMPORTANT_NOT_URGENT, "not_important_not_urgent.json");

        logger.debug("文件映射初始化完成: {}", fileMap);
    }

    /**
     * 加载指定象限的内容
     * @param category 象限分类
     * @return 该象限的内容（JSON格式）
     */
    public String loadContent(String category) {
        String fileName = fileMap.get(category);
        if (fileName == null) {
            logger.warn("未找到分类 {} 对应的文件", category);
            return "[]"; // 返回空的JSON数组
        }

        File file = new File(fileName);
        if (!file.exists()) {
            try {
                if (file.createNewFile()) {
                    logger.info("创建新文件: {}", fileName);
                    // 初始化为空的JSON数组
                    try (FileWriter writer = new FileWriter(file)) {
                        writer.write("[]");
                    }
                }
            } catch (IOException e) {
                logger.error("创建文件 {} 失败", fileName, e);
                return "[]";
            }
            return "[]";
        }

        try {
            StringBuilder content = new StringBuilder();
            try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    content.append(line);
                }
                logger.info("成功加载文件 {}", fileName);
                return content.toString();
            }
        } catch (IOException e) {
            logger.error("读取文件 {} 失败", fileName, e);
            return "[]";
        }
    }

    /**
     * 保存指定象限的内容
     * @param category 象限分类
     * @param content 要保存的内容（JSON格式）
     */
    public void saveContent(String category, String content) {
        String fileName = fileMap.get(category);
        if (fileName == null) {
            logger.warn("未找到分类 {} 对应的文件，无法保存内容", category);
            return;
        }

        try (FileWriter writer = new FileWriter(fileName)) {
            writer.write(content);
            logger.info("成功保存文件 {}，内容长度: {} 字符", fileName, content.length());
        } catch (IOException e) {
            logger.error("保存文件 {} 失败", fileName, e);
        }
    }

    /**
     * 保存使命宣言内容
     * @param content 使命宣言内容
     * @throws IOException 保存文件时可能抛出的异常
     */
    public void saveMissionStatement(String content) throws IOException {
        Path missionFile = getMissionStatementFilePath();
        Files.write(missionFile, content.getBytes(StandardCharsets.UTF_8));
    }

    /**
     * 加载使命宣言内容
     * @return 使命宣言内容，如果文件不存在则返回空字符串
     * @throws IOException 读取文件时可能抛出的异常
     */
    public String loadMissionStatement() throws IOException {
        Path missionFile = getMissionStatementFilePath();
        if (Files.exists(missionFile)) {
            byte[] bytes = Files.readAllBytes(missionFile);
            return new String(bytes, StandardCharsets.UTF_8);
        }
        return "";
    }

    /**
     * 获取使命宣言文件路径
     * @return 使命宣言文件路径
     */
    private Path getMissionStatementFilePath() {
        // 使命宣言文件与四象限数据文件保存在同一目录下
        return dataDir.resolve("mission_statement.txt");
    }
}
